
#ifndef PRIORITYQUEUE_H_
#define PRIORITYQUEUE_H_

/* Definicion de tipo de elemento de la cola de prioridades */
typedef void * pqelementT;

/* Definicion del ADT */
typedef struct pqueueCDT * pqueueADT;

/* Contrato de la cola de prioridades */

/**
 *  Funcion: NewPQueue
 *  Uso: pq = NewPQueue();
 * ----------------------------------------------------------------------
 * Crea una nueva instancia de cola de prioridad.
 * Debe ser llamada siempre antes de utilizar cualquier otra funcion del
 * contrato.
 * En caso de error retorna NULL.
 *
 */
pqueueADT NewPQueue(void);

/**
 *  Funcion: PEnqueue
 *  Uso: pq = PEnqueue(pq, elem, 3);
 * ----------------------------------------------------------------------
 * Inserta un elemento a la cola de prioridades correspondiente.
 * En caso de error retorna 0. De lo contrario retorna 1.
 *
 */
int PEnqueue(pqueueADT pqueue, pqelementT element, int priority);

/**
 *  Funcion: PQueueIsEmpty
 *  Uso: PQueueIsEmpty(pq);
 * ----------------------------------------------------------------------
 * Informa si la cola de prioridad se encuentra si ningun elemento.
 * En caso de estar vacia retorna 1. Caso contrario retorna 0.
 */
int PQueueIsEmpty(pqueueADT pqueue);

/**
 *  Funcion: PDequeue
 *  Uso: pq = PDequeue(pq, elem, 3);
 * ----------------------------------------------------------------------
 * Desencola un elemento de la cola de prioridades.
 * En caso de error retorna Null.
 *
 */
pqelementT PDequeue(pqueueADT pqueue);

/**
 *  Funcion: FreePQueue
 *  Uso: FreePQueue(pq);
 * ----------------------------------------------------------------------
 * Libera una instancia de cola de prioridades.
 * Una vez liberada la cola no se puede llamar a ninguna funcion del
 * contrato.
 */
void FreePQueue(pqueueADT pqueue);

#endif /*PRIORITYQUEUE_H_*/
